Fabian Gülzau
25 Januar 2018
Karten spielen schon seit Beginn eine Rolle im Feld der “Visualisierungen”:
“Spatial data are everywhere” (Bivand et al. 2008: 1)
-> Geographical Information Systems (GIS)
R und GIS:
Problem: voraussetzungsvoll (GIS, R)
Ziel: Karten erstellen und zusätzliche Daten mit ggplot2 ergänzen
Der Mediziner John Snow konnte 1854 eine Choleraepidemie eindämmen und zeigen, dass die Krankheit nicht, wie angenommen, über die Luft übertragen wird, sondern durch verunreinigtes Wasser.
Tufte (1997: 29-32) hebt positiv hervor, dass Snow:
Quelle: Tufte (1997: 30f.).
ggmap (Kahle & Wickham 2013) basiert auf dem “Grammar of Graphics”, wie es in ggplot2 implementiert ist.
Die Logik ist folgendermaßen:
get_map())ggmap())geom_point)Anmerkung: Sogenannte Shapefiles können zudem über über fortify in data.frames transformiert werden.
Im Folgenden werden wir die o.g. Schritte einsetzen, um die Karte aus (Tufte 1997: 30f.) mit R zu rekonstruieren.
Hierfür benötigen wir:
tidyverse (u.a. ggplot2) und ggmapdeath und pump aus dem MoodlekursPakete:
install.packages("ggmap")
# Falls dies nicht klappt:
install.packages("devtools")
devtools::install_github("dkahle/ggmap")
library(tidyverse)
library(ggmap)
library(cowplot)Daten (Quelle):
death <- readRDS(file = "C:\\Users\\User\\HU-Box\\Seafile\\Meine Bibliothek\\Seminare\\WS 2017\\Sessions\\Session 13\\Death")
pump <- readRDS(file = "C:\\Users\\User\\HU-Box\\Seafile\\Meine Bibliothek\\Seminare\\WS 2017\\Sessions\\Session 13\\Pump")Die Daten:
glimpse(death)## Observations: 250
## Variables: 4
## $ count <int> 3, 2, 1, 1, 4, 2, 2, 2, 3, 2, 2, 1, 3, 1, 4, 1, 1, 1,...
## $ geometry <chr> "<Point><coordinates>-0.13793,51.513418</coordinates>...
## $ lon <dbl> -0.137930, -0.137883, -0.137853, -0.137812, -0.137767...
## $ lat <dbl> 51.51342, 51.51336, 51.51332, 51.51326, 51.51320, 51....
glimpse(pump)## Observations: 8
## Variables: 4
## $ count <int> -999, -999, -999, -999, -999, -999, -999, -999
## $ geometry <chr> "<Point><coordinates>-0.136668,51.513341</coordinates...
## $ lon <dbl> -0.136668, -0.139586, -0.139671, -0.131630, -0.133594...
## $ lat <dbl> 51.51334, 51.51388, 51.51491, 51.51235, 51.51214, 51....
ggmap bietet mit get_map mehrere Möglichkeiten Karten herunterzuladen.
get_map() hat u.a. folgende Argumente:
Anwendung von get_map:
# Google Map
snow.map.ggl <- get_map(location = "Soho, London",
zoom = 16,
source = "google",
maptype = "terrain")
# Stamen Map
snow.map.stm <- get_map("Soho, London",
zoom = 16,
maptype="terrain",
source = "stamen")Die Karten lassen sich nun mit der Funktion ggmap in einen Layer für ggplot2 überführen:
gg.map.ggl <- ggmap(snow.map.ggl)
gg.map.stm <- ggmap(snow.map.stm)
# Kombinieren und plotten (cowplot)
plots <- list(gg.map.ggl, gg.map.stm)
library(cowplot)
plot_grid(plotlist = plots, ncol = 2, labels = c("Google Maps", "Stamen Maps"))Demonstration weiterer Basiskarten (Funktion wird nicht angezeigt):
Nun lassen sich mit den bekannten ggplot2-Funktionen weitere Layer ergänzen. Könnt ihr die Punkte und Pumpen hinzufügen? Hier ist ein Codeschnipsel als Hinweis:
gg.map.stm + # Basiskarte
geom_point(...) + # Layer für Todesfälle
geom_point(...) + # Layer für Pumpen
theme_void() + # theme_void, um Achsenbeschriftung zu vermeiden
labs(...) # Titel, Captionggmap enthält zudem weitere hilfreiche Funktionen:
# Query limit = 2,500 (a day)
ISW <- geocode(location = "Universitaetsstr. 3b, Berlin", source = "google")
# The other way aroung
revgeocode(location = c(ISW$lon, ISW$lat), source = "google", output = "address")Mit Hilfe von ggfortify können shapefiles verwendet werden:
get_map, um eine Karte von Berlin zu erhalten:
berlin <- get_map(location = "Berlin",
zoom = 10,
maptype = "toner",
source = "stamen")Shapefile vorbereiten und als Layer verwenden:
library(rgdal)
# Shapefiles (Source: https://daten.berlin.de/datensaetze/rbs-bezirke-dezember-2016)
berlin.shp <- readOGR(dsn = "C:/Users/User/HU-Box/Seafile/Meine Bibliothek/Seminare/WS 2017/Sessions/Session 13/RBS-Berlin") %>%
spTransform(CRS("+proj=longlat +datum=WGS84"))## OGR data source with driver: ESRI Shapefile
## Source: "C:/Users/User/HU-Box/Seafile/Meine Bibliothek/Seminare/WS 2017/Sessions/Session 13/RBS-Berlin", layer: "RBS_OD_BEZ_2016_12"
## with 12 features
## It has 2 fields
# Fortify to plot with ggplot2
berlin.fshp <- fortify(berlin.shp)
# Plot map and overlay with shapefile
ggmap(berlin) +
geom_polygon(data = berlin.fshp, mapping = aes(x = long, y = lat, group = group),
color = "blue", fill = "black", alpha = .4)